/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.app.model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import myftp.core.model.AbstractModel;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *
 * classe conteneur des serveurs en cours
 */
public class ServerManagerModel extends AbstractModel {

    /**
     * liste des serveurs en cours
     * @var servers
     */
    HashMap<Integer, ServerModel> servers = null;
    /**
     * liste des index des tabs serveur
     * @var tabs
     */
    ArrayList<Integer> tabs = null;
    /**
     * liste des transfers en cours par nom
     * @var transferList
     */
    private HashMap<String, ServerTransferModel> transferList;
    /**
     * boolean pour connexion en cours
     * @var connectionAttempt
     */
    private boolean connectionAttempt;
    /**
     * nombre de connexions
     * @var connectCount
     */
    private static Integer connectCount = 1;
    /**
     * index du tab pour un nouveau serveur
     * @var tabIndex
     */
    private static Integer tabIndex = 0;
    /**
     * liste des transfers par id
     * @var transferId
     */
    private HashMap<Integer, ServerTransferModel> transferId;

    /**
     * construteur
     * init des differents attributs
     */
    public ServerManagerModel() {

        this.servers = new HashMap<Integer, ServerModel>();
        this.tabs = new ArrayList<Integer>();
        this.transferList = new HashMap<String, ServerTransferModel>();
        this.transferId = new HashMap<Integer, ServerTransferModel>();
    }
/**
 * test si des serveurs sont instanciés
 * @return boolean
 */
    public boolean hasServers() {
        //this.connexionAttempt
        if (!this.servers.isEmpty() || this.connectionAttempt) {
            return true;
        }
        return false;
    }
/**
 * getter du tableau tabs
 * @return ArrayList
 */
    public ArrayList<Integer> getTabs() {
        return tabs;
    }
/**
 * setter du tableau tabs
 * @param tabs
 */
    public void setTabs(ArrayList<Integer> tabs) {
        this.tabs = tabs;
    }
/**
 * test si un serveur existe
 * @param serverIndex
 * @return boolean
 */
    public boolean hasServer(Integer serverIndex) {
        //this.connexionAttempt
        if (this.servers.containsKey(serverIndex)) {
            return true;
        }
        return false;
    }
/**
 * setter pour une connexion en cours
 * @param b
 */
    public void setConnectionAttempt(boolean b) {
        this.connectionAttempt = b;
    }
/**
 * ajout d'un serveur
 * @param server
 * @return Integer (tabIndex)
 */
    public synchronized Integer addServer(ServerModel server) {
        this.servers.put(connectCount, server);
        server.setConnectIndex(connectCount);
        tabs.add(connectCount);
        connectCount++;
        return tabIndex++;
    }
/**
 * déconnexion d'un serveur
 * @param serverIndex
 * @throws IOException
 * @throws InterruptedException
 */
    public void disconnect(Integer serverIndex) throws IOException, InterruptedException {

        this.servers.get(serverIndex).disconnect();
        this.servers.remove(serverIndex);
        tabs.remove(serverIndex);
        tabIndex--;
    }
/**
 * retourn un serveur
 * @param serverIndex
 * @return ServerModel
 */
    public ServerModel getServer(Integer serverIndex) {
        if (!this.hasServer(serverIndex)) {
            return null;
        }
        return this.servers.get(serverIndex);
    }
/**
 * déconnexion de tous les serveurs
 */
    public void disconnectAll() {
        tabIndex--;
        while (!this.tabs.isEmpty()) {
            Integer serverIndex = tabs.get(tabIndex);

            try {
                this.disconnect(serverIndex);
            } catch (IOException ex) {
            } catch (InterruptedException ex) {
            }
        }
    }
/**
 * ajout d'un transfer
 * @param index
 * @param server
 */
    public synchronized void addTransferAction(String index, ServerTransferModel server) {
        this.transferId.put(server.getTransferServer().getConnectIndex(), server);
        this.transferList.put(index, server);
    }
/**
 * getter pour les transfers par nom
 * @param index
 * @return ServerTransferModel
 */
    public synchronized ServerTransferModel getTransferAction(String index) {
        if (!this.transferList.containsKey(index)) {
            return null;
        }
        return this.transferList.get(index);
    }
/**
 * getter pour les transfers par id
 * @param index
 * @return ServerTransferModel
 */
    public synchronized ServerTransferModel getTransferAction(Integer index) {
        if (!this.transferId.containsKey(index)) {
            return null;
        }
        return this.transferId.get(index);
    }
/**
 * suppression d'un transfer
 * @param index
 */
    public void deleteTransferAction(String index) {
        ServerTransferModel tServer = this.transferList.remove(index);
        this.transferId.remove(tServer.getTransferServer().getConnectIndex());
        tServer.getTransferServer().hasTransfer(false);
        tServer.getTransferServer().disconnect();
    }
}
